// 控制页面登录权限的文件
import router from '@/router'
import store from '@/store' // 引入store实例
import nProgress from 'nprogress'
import 'nprogress/nprogress.css' // 引入进度条样式
// 无需导出  只要执行代码即可‘

// 前置守卫：
// next是前置守卫必须执行的钩子  next 不执行的话 页面会死
// next（） 放过
// next（false）跳转终止
// next（地址）跳转到某个地址
const baiList = ['/login', '/404']

router.beforeEach(async(to, from, next) => {
  nProgress.start() // 开启进度条
  if (store.getters.token) {
    // 有token
    if (to.path === 'login') {
      // 访问的是login
      next('/')
    } else {
      // 要判断是不是已经获取过资料了
      if (!store.getters.userId) {
        // 如果id不存在 意味着当前没有用户资料 就要去获取用户资料
        // vuex的action是一个promise
        // await store.dispatch('user/getUserInfo')

        const { roles } = await store.dispatch('user/getUserInfo')
        // 此时已经获取完资料
        // console.log(roles)
        const routes = await store.dispatch('permission/filterRoutes', roles.menus)
        // console.log(routes)
        // 此时得到的routes是当前用户的所拥有的的动态路由的权限
        // router.addRoutes(routes)
        router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }]) // 将当前动态路由加到当前路由规则上
        // 加await的意思是 强制等待获取完用户资料之后 才去放行  就能保证 用户进到页面时候 有资料
        // 添加完路由之后 不能用next()  要用next(to.path) 否则地址不能生效 这算是一个已知 的小缺陷
        // 执行完addRoutes 必须执行next(to.path) 不能执行 next() 这是一个已知的问题缺陷
        next(to.path) // 解决直接执行next()时的异常
      } else {
        next() // 放行
      }
    }
  } else {
    //   没有token
    if (baiList.indexOf(to.path) > -1) {
      // 要去的地址在白名单中

      next()
    } else {
      // 不在白名单则跳转到登陆页面
      next('/login')
    }
  }
  nProgress.done() // 关闭进度条
})

// 后置守卫
router.afterEach(() => {
  nProgress.done() // 关闭进度条
})
